package com.chf.carsystem.users.interceptor;

import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.annotation.Resources;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.chf.carsystem.users.pojo.Menu;
import com.chf.carsystem.users.pojo.User;
import com.chf.carsystem.users.service.IUserService;
/**
 * 创建一个拦截器类
 * @author Administrator
 *
 */
@Component("myHeadInterceptor")
public class MyHeadInterceptor extends HandlerInterceptorAdapter{
/*
 * 总结：
 * controller充当的是servlert的角色  它return的方法 返回的是jsp页面的地址,相当于是request请求
 * return的redirect属性是重定向  可以重定向到其它的controller方法  不能直接重定向到jsp页面  
 * 
 * 在类上面的@controller @service @component 是让spring自动生成bean
 * 属性上的@result是让spring自动装配
 * 
 * 而方法上@requestMapping("XXXX")指的是访问路径 
 * 如果在contorller类上面配置拦截器需要拦截的父路径 需要在类上面页配置注解 @requestMapping("XX")
 * 
 * */
	@Resource
	private IUserService userService;
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		/*注： 在拦截器中 目前的两个功能 是    拦截非法登录  和  访问权限*/
		//判断若符合条件放行
		HttpSession session = request.getSession();
		User user =(User) session.getAttribute("user");
		if(user == null)
		{
			//非法登录判断是否成功登录
			
			//说明是登录不成功 拦截
			session.setAttribute("info", "禁止非法登录，请登录");
			//跳转到打开登录页的controller
			response.sendRedirect(request.getContextPath()+"/login.html");
			return false;
		}
		//访问权限的限制判断  全部针对访问head/**地址 都是用户登陆成功之后 
		/*
		 * 1.得到当前的路径
		 * 2.得到参数
		 * 3.得到该当前用户所属角色下的菜单url
		 * 4.循环遍历菜单 url
		 * 5.如果菜单url和当前的访问路径有被包含的关系 说明有访问的权限放行
		 * 6.否则拦截 跳转到指定页  或者 给一个显示无权访问的页面 
		 * 
		 * */
		/*1.得到当前路径*/
		String reqUrl = request.getRequestURL()+"";
		/*2.得到当前访问参数*/
		String queryString = request.getQueryString();
		String url = reqUrl + "?" + queryString;
		/*3.得到该当前用户所属角色Id根据id查询菜单和角色的关系表 查询roleId对应的所有菜单url*/
		//这里需要创建角色jopo 菜单jopo 多对多查询
		List<Menu> menus = this.userService.findListMenusByRoleIdService(user.getRoleId());
		boolean flag = false;
		for (Iterator iterator = menus.iterator(); iterator.hasNext();) {
			Menu menu = (Menu) iterator.next();
			//判断包含关系
			if(url.indexOf(menu.getUrl()) != -1)
			{
				//说明包含
				flag = true;
				break;
			}
		}
		if(!flag)
		{
			//没有权限
			response.setContentType("text/html;charset=UTF-8");
			PrintWriter out = response.getWriter();
			out.write("没有权限登录，需要练习独孤九剑");
			return false;
		}
		//登录成功 放行
		return true;
	}

	
	
	
}
